使用拖放操纵器可以使用户在 Kanzi 应用程序中拖放节点。请参阅 启用节点的拖放手势。
使用 拖放操纵器 (Drag and Drop Manipulator) 触发器响应拖放手势。例如,您可以设置用户拖放节点时的节点外观。请参阅 使用拖放操纵器 (Drag and Drop Manipulator) 触发器。
拖放操纵器是一种输入操纵器,您可以用于在 Kanzi 应用程序中添加手势识别到节点上。您可以通过 Kanzi Engine API 分配输入操纵器。请参阅使用输入操纵器。
通过完成教程学习如何使用拖放操纵器。请参阅 教程:拖放。
要启用节点的拖放手势:
#
符号后跟别名名称访问别名目标节点。private: // 定义 2D 节点的DragAndDropManipulator::StartedMessage
消息处理程序 //这些节点带有生成拖放消息的输入操纵器。 //这样可为拖动准备 2D 节点。 void onDragStarted(DragAndDropManipulator::StartedMessageArguments& messageArguments) { //从消息参数获得用户拖动的节点。 Node2DSharedPtr dragAndDropNode = dynamic_pointer_cast<Node2D>(messageArguments.getSource()); if (!dragAndDropNode) { return; } //保存用户相对于节点原点(默认情况下为左上角) //开始拖动节点的起点。 m_dragGrabOffset = messageArguments.getPoint(); //在节点上开始拖放手势时,让节点位于前面。 dragAndDropNode->moveToFront(); } //定义 2D 节点的DragAndDropManipulator::MovedMessage
消息处理程序 //这些节点带有生成拖放消息的输入操纵器。 //这样可按用户拖动的距离变换(移动)节点。 void onDragMoved(DragAndDropManipulator::MovedMessageArguments& messageArguments) { //从消息参数获得用户拖动的节点。 Node2DSharedPtr dragAndDropNode = dynamic_pointer_cast<Node2D>(messageArguments.getSource()); if (!dragAndDropNode) { return; } //相对于节点原点移动 getPoint 提供的行程距离。 //要保持从节点上相同的点开始拖动,减去抓取偏移。 SRTValue2D transform = dragAndDropNode->getLayoutTransformation(); transform.translate(messageArguments.getPoint() - m_dragGrabOffset); dragAndDropNode->setLayoutTransformation(transform); } //从用户按下或点击的 DragAndDropNode 左上角偏移。 Vector2 m_dragGrabOffset;
onProjectLoaded()
函数中创建 DragAndDropManipulator
并订阅其消息。virtual void onProjectLoaded() KZ_OVERRIDE { ScreenSharedPtr screen = getScreen(); Domain* domain = getDomain(); //使用别名获取DragAndDropNode。 NodeSharedPtr dragAndDropNode = screen->lookupNode<Node>("#DragAndDropNode"); //创建生成拖放消息的输入操纵器。 DragAndDropManipulatorSharedPtr nodeDragAndDropManipulator = DragAndDropManipulator::create(domain); //添加输入操纵器到 DragAndDropNode。 dragAndDropNode->addInputManipulator(nodeDragAndDropManipulator); //在拖放开始前设置长按持续时间为 200 ms。默认值为 500 ms。 //这是用户在开始拖动节点前需按下节点的时间。 nodeDragAndDropManipulator->setPressDuration(chrono::milliseconds(200)); //订阅 DragAndDropNode 节点的DragAndDropManipulator::StartedMessage
消息。 //DragAndDropManipulator
在用户按下该节点 //获取DragAndDropManipulator::setPressDuration
设置的持续时间时生成此消息。 dragAndDropNode->addMessageHandler(DragAndDropManipulator::StartedMessage, bind(&MyProject::onDragStarted, this, placeholders::_1)); //订阅 DragAndDropNode 节点的DragAndDropManipulator::MovedMessage
消息。 //DragAndDropManipulator
在手指或鼠标移动时生成此消息。 dragAndDropNode->addMessageHandler(DragAndDropManipulator::MovedMessage, bind(&MyProject::onDragMoved, this, placeholders::_1)); }
使用 拖放操纵器 (Drag and Drop Manipulator) 触发器响应拖放手势。例如,您可以设置用户拖放节点时的节点外观。
拖放操纵器 (Drag and Drop Manipulator) 有这些触发器:
要使用拖放操纵器 (Drag and Drop Manipulator) 触发器:
有关详细信息,请参阅 API reference 中的 DragAndDropManipulator
类。